// JSPAI下单返回的prepay_id 预支付交易会话标识。用于后续接口调用中使用，该值有效期为2小时
// https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_1.shtml
import {
  trim, compact, get, isEmpty
} from 'lodash';
import { DataTypes, Model, UUIDV4 } from 'sequelize';
import { MySqlModel, getSequelize } from '../db';
import { WxPrepayPaidStatus, getToday } from '../utils';

class ReservationRefund extends MySqlModel {

}

ReservationRefund.init({
  id: {
    type: DataTypes.UUID, unique: 'id', allowNull: false, defaultValue: UUIDV4, validate: { isUUID: 4 }, primaryKey: true, comment: '主键'
  },
  reservation_prepay_id: {
    type: DataTypes.UUID, allowNull: false, validate: { isUUID: 4 }, comment: '预订下单id'
  },
  hotel_id: {
    type: DataTypes.UUID, allowNull: false, validate: { isUUID: 4 }, comment: '主体'
  },
  openid: {
    type: DataTypes.STRING(50), allowNull: false, comment: '用户唯一标识'
  }, // 发起人
  appid: {
    type: DataTypes.STRING(50), allowNull: false, comment: '公众号的唯一标识'
  },
  mchid: {
    type: DataTypes.STRING(50), allowNull: true, defaultValue: null, comment: '直连商户号'
  },
  business_date: {
    type: DataTypes.DATEONLY, allowNull: false, comment: '交易日期'
  },
  confirm_number: {
    type: DataTypes.STRING(50), allowNull: false, comment: '确认号'
  },
  resv_name_id: {
    type: DataTypes.STRING(50), allowNull: false, comment: 'resv_name_id'
  },
  primary_confirm_number: {
    type: DataTypes.STRING(50), allowNull: false, comment: '主预订确认号'
  },
  primary_resv_name_id: {
    type: DataTypes.STRING(50), allowNull: false, comment: '主预订resv_name_id'
  },
  out_trade_no: {
    type: DataTypes.STRING(50), allowNull: false, allowNull: false, comment: '商户订单号'
  },
  wx_transaction_id: {
    type: DataTypes.STRING(50), allowNull: true, defaultValue: null, comment: '微信支付系统生成的订单号'
  },
  reason: {
    type: DataTypes.STRING(50), allowNull: true, defaultValue: null, comment: '退款原因,会在下发给用户的退款消息中体现退款原因'
  },
  reference: {
    type: DataTypes.STRING(100), allowNull: true, defaultValue: null, comment: '退款原因,酒店审核'
  },
  out_refund_no: {
    type: DataTypes.STRING(50), allowNull: false, allowNull: false, comment: '商户退款单号'
  },
  refund_id: {
    type: DataTypes.STRING(50), allowNull: true, defaultValue: null, comment: '微信退款单号'
  },
  refund_amount: {
    type: DataTypes.DECIMAL(10, 2), allowNull: false, defaultValue: 0, comment: '退款金额'
  },
  channel: { // 枚举值： ORIGINAL：原路退款 BALANCE：退回到余额 OTHER_BALANCE：原账户异常退到其他余额账户 OTHER_BANKCARD：原银行卡异常退到其他银行卡
    type: DataTypes.STRING(16), allowNull: true, defaultValue: 'ORIGINAL', comment: '退款渠道'
  },
  user_received_account: {
    type: DataTypes.STRING(64), allowNull: true, defaultValue: null, comment: '退款入账账户'
  },
  //   取当前退款单的退款入账方，有以下几种情况：
  // 1）退回银行卡：{银行名称}{卡类型}{卡尾号}
  // 2）退回支付用户零钱:支付用户零钱
  // 3）退还商户:商户基本账户商户结算银行账户
  // 4）退回支付用户零钱通:支付用户零钱通
  refund_status: {
    type: DataTypes.STRING(20), allowNull: false, defaultValue: 'PROCESSING', comment: '退款状态'
  },
  //   退款状态，枚举值：
  // SUCCESS：退款成功
  // CLOSED：退款关闭
  // PROCESSING：退款处理中
  // ABNORMAL：退款异常，退款到银行发现用户的卡作废或者冻结了，导致原路退款银行卡失败，可前往【商户平台—>交易中心】，手动处理此笔退款

  funds_account: {
    type: DataTypes.STRING(32), allowNull: true, defaultValue: 'UNSETTLED', comment: '资金账户'
  },
  //   退款所使用资金对应的资金账户类型
  // 枚举值：
  // UNSETTLED : 未结算资金
  // AVAILABLE : 可用余额
  // UNAVAILABLE : 不可用余额
  // OPERATION : 运营户
  // BASIC : 基本账户（含可用余额和不可用余额）
  success_time: { // 支付时间
    type: DataTypes.DATE, allowNull: true, defaultValue: null, comment: '退款成功时间'
  },
  post_to_pms: {
    type: DataTypes.BOOLEAN, allowNull: false, defaultValue: false, comment: '是否 需要PMS自动入账'
  },
  is_pms_posted: {
    type: DataTypes.BOOLEAN, allowNull: false, defaultValue: false, comment: 'PMS是否入账成功'
  },
  created_at: {
    type: DataTypes.DATE, allowNull: false, comment: '创建时间'
  },
  updated_at: {
    type: DataTypes.DATE, allowNull: false, comment: '更新时间'
  },
  version: {
    type: DataTypes.INTEGER, allowNull: false, defaultValue: 0, comment: '版本控制'
  }
}, {
  sequelize: getSequelize(),
  tableName: 'reservation_refund',
  comment: '预订微信支付退款表',
  indexes: [
    { fields: ['hotel_id', 'primary_confirm_number'] },
    { fields: ['out_refund_no'] },
    { fields: ['refund_id'] },
  ]
});

ReservationRefund.beforeValidate((instance, options) => {
  if (instance.isNewRecord) {
    instance.business_date = getToday();
  }
})

// https://sequelize.org/api/v6/class/src/model.js~model#static-method-hasMany

export default ReservationRefund;
